package com.wll.exportfile.world.poitl;

import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.data.ChartMultiSeriesRenderData;
import com.deepoove.poi.data.ChartSingleSeriesRenderData;
import com.deepoove.poi.data.Charts;
import com.deepoove.poi.data.Pictures;
import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
import com.wll.exportfile.world.entity.Education;
import com.wll.exportfile.world.entity.ImageInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * 参考地址
 * https://blog.csdn.net/I_am_peanut/article/details/121423198
 */
public class DeepooveExportWorld {

    private static Logger logger = LoggerFactory.getLogger(DeepooveExportWorld.class);

    // 模板路径
    static final String baseTemplatePath = "E://my_work//study//exportFile//src//main//resources//world//deepoove//";

    // 生成word的路径
    static final String baseFileDir = "E:/temp/" + System.currentTimeMillis() + ".docx";

    // 图片路径
    static final String imagePath = "E:\\my_work\\study\\exportFile\\src\\main\\resources\\static\\image\\png\\";

    public static void main(String[] args) throws IOException {


        // 单个图片导出   批量图片
//        generatorWorldImage();
        // 文本导出  表格循环批量图片
        generatorWorldText();
        // 生成统计图表
//        generatorWorldECharts();
    }


    /**
     * 导出world 统计图表
     *
     * @throws IOException
     */
    static void generatorWorldECharts() throws IOException {

        //柱状图
        ChartMultiSeriesRenderData chart = Charts.ofMultiSeries("ChartTitle", new String[]{"中文", "English", "法语", "西班牙语"}).addSeries("countries", new Double[]{15.0, 6.0, 4.5, 2.3}).addSeries("speakers", new Double[]{223.0, 119.0, 110.0, 120.0}).create();

        // 饼图
        ChartSingleSeriesRenderData pie = Charts.ofSingleSeries("ChartTitle", new String[]{"美国", "中国", "印度", "意大利"}).series("countries", new Integer[]{9826675, 9596961, 1234564, 132154}).create();

        Map<String, Object> data = new HashMap<String, Object>() {
            {
                put("title", "导出插入统计图表");
                put("content", "模板制作： 单系列图表的标签是一个文本：{{var}}，标签位置在：图表区格式—\u200B可选文字—\u200B标题（新版本Microsoft Office标签位置在：编辑替换文字-替换文字）。 ");
                put("pieChart", pie);
                put("barChart", chart);
            }
        };
        // 模板路径
        String templatePath = baseTemplatePath + "echarts.docx";
        // 生成word的文件
        // 读取模板渲染参数
        // template.docx(注意：如果标签内要使用运算符，需要开启Spring表达式):
//        Configure configure = Configure.builder().useSpringEL(true).build();
        XWPFTemplate template = XWPFTemplate.compile(templatePath).render(data);
        String wordPath = baseFileDir;
        try {
            // 将模板参数写入路径
            template.writeToFile(wordPath);
            template.close();
        } catch (Exception e) {
            logger.error("生成word异常{}", e.getMessage());
            e.printStackTrace();
        }
        System.out.println("生成文档路径：" + wordPath);

    }

    /**
     * 导出world 插入图片  支持图片格式
     * emf|wmf|pict|jpeg|png|dib|gif|tiff|eps|bmp|wpg
     *
     * @throws IOException
     */
    static void generatorWorldImage() throws IOException {

        Map<String, Object> data = new HashMap<String, Object>() {
            {
                put("title", "导出插入图片");
                put("content", "模板制作： 1. 插入一张图片\n 2.右键图片> 设置图片格式 > 可选文字：标题填写占位符 {{image1}}\n ");

                // 下面各个图片方法混合使用有点小问题
                // 方法二、指定图片大小
                put("image1", Pictures.ofLocal(imagePath + "1.png").size(420, 350).center().create());
                put("imageTxt1", "图片文字说明：这是个很霸气的图片？？？？别害怕！！！！");
                put("image2", Pictures.ofLocal(imagePath + "2.png").size(420, 350).center().create());
                put("imageTxt2", "图片文字说明：这是个很霸气的图片？？？？别害怕！！！！");
                put("image3", Pictures.ofLocal(imagePath + "3.png").size(420, 350).center().create());
                put("imageTxt3", "图片文字说明：这是个很霸气的图片？？？？别害怕！！！！");
                put("image4", Pictures.ofLocal(imagePath + "4.png").size(420, 350).center().create());
                put("imageTxt4", "图片文字说明：这是个很霸气的图片？？？？别害怕！！！！");

                // 创建 image 实体对象  模板 {{?images}} {{_index+1}} {{@picture}} {{remark}} {{/images}}
                // 注意：如果标签内要使用运算符，需要开启Spring表达式
                // Configure configure = Configure.builder().useSpringEL(true).build();
                // XWPFTemplate template = XWPFTemplate.compile(templatePath, configure).render(data);
                // https://blog.csdn.net/liangjiabao5555/article/details/124933626
                List<ImageInfo> list = new ArrayList<>();
                list.add(new ImageInfo(Pictures.ofLocal(imagePath + "5.png").size(420, 350).center().create(), "图片文字说明：这是个很霸气的图片？？？？别害怕！！！！"));
                list.add(new ImageInfo(Pictures.ofLocal(imagePath + "6.png").size(420, 350).center().create(), "图片文字说明：这是个很霸气的图片？？？？别害怕！！！！"));
                put("images", list);


//                // 方法三、图片流
//                put("picture2", Pictures.ofStream(new FileInputStream(imagePath + "2.png")).size(420, 350).create());
//                // 网络图片(注意网络耗时对系统可能的性能影响)
//                put("picture3", Pictures.ofUrl("http://deepoove.com/images/icecream.png").size(100, 100).create());
//                // java图片
//                BufferedImage bufferedImage = ImageIO.read(new FileInputStream(imagePath + "3.png"));
//                put("wll", Pictures.ofBufferedImage(bufferedImage, PictureType.PNG).size(100, 100).create());
            }
        };
        // 模板路径
        String templatePath = baseTemplatePath + "image.docx";
        // 生成word的文件
        // 读取模板渲染参数
        // template.docx(注意：如果标签内要使用运算符，需要开启Spring表达式):
        Configure configure = Configure.builder().useSpringEL(true).build();
        XWPFTemplate template = XWPFTemplate.compile(templatePath, configure).render(data);
        String wordPath = baseFileDir;
        try {
            // 将模板参数写入路径
            template.writeToFile(wordPath);
            template.close();
        } catch (Exception e) {
            logger.error("生成word异常{}", e.getMessage());
            e.printStackTrace();
        }
        System.out.println("生成文档路径：" + wordPath);
    }

    /**
     * 导出world文本
     *
     * @throws IOException
     */
    static void generatorWorldText() throws IOException {
        Map<String, Object> data = new HashMap<String, Object>();
        data.put("title", "测试test咳咳");
        Map<String, Object> user = new HashMap<String, Object>();
        user.put("name", "段然涛");
        user.put("sex", "男");
        user.put("birthday", "1994-03-14");
        user.put("phone", "17737138812");
        user.put("address", "河南省许昌市");
        user.put("school", "江西科技师范大学");
        data.put("user", user);

        List<Education> educations = new ArrayList<Education>();
        educations.add(new Education("1", "姜中", "200809", "201207", "keke", Pictures.ofLocal("E:\\my_work\\study\\exportFile\\src\\main\\resources\\static\\image\\png\\1.png").size(240, 240).create()));
        educations.add(new Education("2", "江西科技师范大学", "201209", "201507", "hehe", Pictures.ofLocal("E:\\my_work\\study\\exportFile\\src\\main\\resources\\static\\image\\png\\2.png").size(204, 204).create()));
        data.put("educations", educations);
        // 模板路径
        String templatePath = baseTemplatePath + "text.docx";
        LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
        Configure config = Configure.builder().bind("educations", policy).build();
        XWPFTemplate template = XWPFTemplate.compile(templatePath, config).render(data);
        // 生成word的文件
        String wordPath = baseFileDir;
        // 读取模板渲染参数
        try {
            // 将模板参数写入路径
            template.writeToFile(wordPath);
            template.close();
        } catch (Exception e) {
            logger.error("生成word异常{}", e.getMessage());
            e.printStackTrace();
        }
        System.out.println("生成文档路径：" + wordPath);
    }


}
